Skip to content

feat(evolution): generation backlog gate — throttle features, never bugs#462

Merged
Lexus2016 merged 2 commits into
mainfrom
evolution/generation-backlog-gate
Jun 22, 2026
Merged

feat(evolution): generation backlog gate — throttle features, never bugs#462
Lexus2016 merged 2 commits into
mainfrom
evolution/generation-backlog-gate

Conversation

@Lexus2016

Copy link
Copy Markdown
Owner

Why

Complements #461 (process every 4h). Even with faster processing, generation (~25/day) can still outpace it, so the open backlog grows — the recurring "too many unprocessed issues". This bounds it.

Policy (owner's choice: "skip features, but add bugs")

When the open feature backlog ≥ cap:

  • SKIP new [FEATURE] / [IMPROVEMENT] / [CAPABILITY] / [UX] / [PERFORMANCE] proposals.
  • ALWAYS file [FIX] bugs — real defects block work and are cheap to keep; never throttled.

Rationale: features can wait for the backlog to drain; bugs can't.

What

  • scripts/evolution_backlog_gate.py — counts open FEATURE issues (open AND not a bug: title not [FIX], no bug label). check → exit 1 = throttle / 0 = ok, with a JSON summary. Cap = EVOLUTION_FEATURE_BACKLOG_CAP (default 25). Fail-OPEN if gh is unavailable (never blocks generation on a failed count).
  • evolution-issues: runs the gate before filing proposals; throttle ⇒ skip feature creation this cycle.
  • evolution-introspection: bugs ([FIX]) always filed; gate applies only to the non-bug (capability/ux/performance) proposals.
  • evolution-research (no terminal toolset): advisory note only — bias toward fewer proposals when the board is full. No runnable command (avoids dead wiring; enforced by test_evolution_skill_integrity).

Tests

tests/scripts/test_evolution_backlog_gate.py — 18 (is_bug, counting, cap resolution, throttle/ok, bugs don't count toward cap, fail-open, CLI exit codes). Skill-integrity green. 29 passed locally.

Live check: 41 open features > cap 25 → would throttle now (correct — board is over-full; bugs would still flow).

Notes

  • Takes effect after the server re-registers/pulls (skills sync on hermes update + gateway restart).
  • Cap is env-tunable; raise/lower EVOLUTION_FEATURE_BACKLOG_CAP to taste.

Complements the every-4h processing change (#461): even with faster
processing, generation (~25/day) can outpace it. This gate bounds the open
backlog so it stops growing unbounded (the recurring 'too many unprocessed
issues').

Policy (owner's): when the open FEATURE backlog >= cap, SKIP creating new
[FEATURE]/[IMPROVEMENT]/[CAPABILITY]/[UX] proposals — but ALWAYS file [FIX]
bugs (real defects block work and are cheap to keep). Features can wait for
the backlog to drain; bugs cannot.

- scripts/evolution_backlog_gate.py: counts open FEATURE issues (open AND not
  a bug: title not [FIX], no 'bug' label);  exits 1=throttle/0=ok with
  a JSON summary. Cap = EVOLUTION_FEATURE_BACKLOG_CAP (default 25). Fail-OPEN
  if gh is unavailable (never blocks generation on a failed count).
- evolution-issues: runs the gate before filing proposals; throttle => skip
  feature creation this cycle.
- evolution-introspection: bugs ([FIX]) always; gate the non-bug
  (capability/ux/performance) proposals.
- evolution-research (no terminal): advisory note to bias toward fewer
  proposals when the board is full — no runnable command (avoids dead wiring;
  caught by test_evolution_skill_integrity).

18 gate tests + skill-integrity green (29 passed). Live: 41 open features >
cap 25 -> would throttle now (correct: board over-full). Takes effect after
the server re-registers/pulls.
@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

🔎 Lint report: evolution/generation-backlog-gate vs origin/main

ruff

Total: 0 on HEAD, 0 on base (➖ 0)

🆕 New issues: none

✅ Fixed issues: none

Unchanged: 0 pre-existing issues carried over.

ty (type checker)

Total: 11567 on HEAD, 11566 on base (🆕 +1)

🆕 New issues (1):

Rule Count
unresolved-import 1
First entries
tests/scripts/test_evolution_backlog_gate.py:9: [unresolved-import] unresolved-import: Cannot resolve imported module `evolution_backlog_gate`

✅ Fixed issues: none

Unchanged: 6086 pre-existing issues carried over.

Diagnostics are surfaced as warnings — this check never fails the build.

The Windows-footgun checker matched the literal 'failing open (no throttle)'
as an open() call. Reword to 'defaulting to no throttle' — no behavior change.
@Lexus2016 Lexus2016 merged commit 9ddfaf9 into main Jun 22, 2026
39 checks passed
@Lexus2016 Lexus2016 deleted the evolution/generation-backlog-gate branch June 22, 2026 16:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant